2342
Created at : 2024-11-19 17:58
2342
#include <iostream>
#include <array>
constexpr int MaxDDR = 100'000;
constexpr int64_t DPMax = INT64_MAX;
using namespace std;
int64_t DP[MaxDDR + 1][5][5];
int64_t CalcCost(int From, int To);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) DP[0][l][r] = DPMax;
DP[0][0][0] = 0;
int i = 0;
while(true)
{
int Pos;
cin >> Pos;
if(Pos == 0)
{
int64_t Result = DPMax;
for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) Result = min(Result, DP[i][l][r]);
cout << Result;
break;
}
++i;
for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) DP[i][l][r] = DPMax;
for(int l = 0; l < 5; ++l)
{
for(int r = 0; r < 5; ++r)
{
if(DP[i - 1][l][r] == DPMax) continue;
DP[i][l][Pos] = min(DP[i][l][Pos], DP[i - 1][l][r] + CalcCost(r, Pos));
DP[i][Pos][r] = min(DP[i][Pos][r], DP[i - 1][l][r] + CalcCost(l, Pos));
}
}
}
return 0;
}
int64_t CalcCost(int From, int To)
{
if(From == To) return 1;
else if(From == 0) return 2;
else if(abs(From - To) == 2) return 4;
else return 3;
}